--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 49d023379f8c3c35bab1e5c6c779f1d0f3a77fb4
Parents : 01a27cf
Author : Mark Qvist <mark@unsigned.io>
Date : 2025-01-16T23:01:46+01:00
Work around for SX1280 modem RSSI status latch on invalid preamble lengths
Changes
Diff
diff --git a/sx128x.cpp b/sx128x.cpp
index a77920b..301dd0d 100644
--- a/sx128x.cpp
+++ b/sx128x.cpp
@@ -86,6 +86,11 @@ extern SPIClass SPI;
#define MAX_PKT_LENGTH 255
+// #define PIN_PREAMBLE 38
+// #define PIN_HEADER 16
+// #define PIN_CAD 15
+// #define PIN_TRIG 39
+
sx128x::sx128x() :
_spiSettings(8E6, MSBFIRST, SPI_MODE0),
_ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN), _rxen(pin_rxen), _busy(LORA_DEFAULT_BUSY_PIN), _txen(pin_txen),
@@ -129,6 +134,12 @@ void sx128x::handleDio0Rise() {
}
bool sx128x::preInit() {
+ // pinMode(PIN_PREAMBLE, OUTPUT);
+ // pinMode(PIN_HEADER, OUTPUT);
+ // pinMode(PIN_CAD, OUTPUT);
+ // pinMode(PIN_TRIG, OUTPUT);
+ //////////////////////////
+
pinMode(_ss, OUTPUT);
digitalWrite(_ss, HIGH);
@@ -402,29 +413,53 @@ int sx128x::endPacket() {
}
unsigned long preamble_detected_at = 0;
-unsigned long header_detected_at = 0;
extern long lora_preamble_time_ms;
extern long lora_header_time_ms;
+bool false_preamble_detected = false;
bool sx128x::dcd() {
+ bool preamble_detected = false;
+ bool header_detected = false;
bool carrier_detected = false;
+ bool trig = false;
uint8_t buf[2] = {0}; executeOpcodeRead(OP_GET_IRQ_STATUS_8X, buf, 2);
+ uint32_t header_detect_max_time = lora_preamble_time_ms + lora_header_time_ms;
+ uint32_t now = millis();
+
+ if ((buf[1] & IRQ_HEADER_DET_MASK_8X) != 0) {
+ preamble_detected = false;
+ header_detected = true;
+ carrier_detected = true;
+ } else {
+ header_detected = false;
+ }
if ((buf[0] & IRQ_PREAMBLE_DET_MASK_8X) != 0) {
carrier_detected = true;
- if (preamble_detected_at == 0) preamble_detected_at = millis();
- if (millis() - preamble_detected_at > lora_preamble_time_ms + lora_header_time_ms) {
+ if (preamble_detected_at == 0) { preamble_detected_at = now; }
+ if (now - preamble_detected_at > header_detect_max_time) {
+ preamble_detected = false;
preamble_detected_at = 0;
- uint8_t clearbuf[2] = {0};
+
+ if (!header_detected) { false_preamble_detected = true; }
+
+ uint8_t clearbuf[2] = {0};
clearbuf[0] = IRQ_PREAMBLE_DET_MASK_8X;
executeOpcode(OP_CLEAR_IRQ_STATUS_8X, clearbuf, 2);
+ digitalWrite(PIN_PREAMBLE, LOW);
+
+ } else {
+ if (!header_detected) { preamble_detected = true; }
+ else { preamble_detected = false; }
}
}
- if ((buf[1] & IRQ_HEADER_DET_MASK_8X) != 0) {
- carrier_detected = true;
- header_detected_at = millis();
- }
+ // if (carrier_detected || preamble_detected || header_detected) { trig = true; }
+ // if (trig) { digitalWrite(PIN_TRIG, HIGH); } else { digitalWrite(PIN_TRIG, LOW); }
+ // if (preamble_detected) { digitalWrite(PIN_PREAMBLE, HIGH); } else { digitalWrite(PIN_PREAMBLE, LOW); }
+ // if (header_detected) { digitalWrite(PIN_HEADER, HIGH); } else { digitalWrite(PIN_HEADER, LOW); }
+ // if (false_preamble_detected) { digitalWrite(PIN_CAD, HIGH); } else { digitalWrite(PIN_CAD, LOW); }
+ if (false_preamble_detected) { sx128x_modem.receive(); false_preamble_detected = false; }
return carrier_detected;
}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────